merge k sorted lists

79

#include <bits/stdc++.h>
using namespace std;

struct Node {
	int data;
	struct Node* next;
};

struct Node* newNode(int data) {
	struct Node* new_node = new Node();
	new_node->data = data;
	new_node->next = NULL;

	return new_node;
}

// 'compare' function used to build
// up the priority queue
struct compare {
	bool operator()(
		struct Node* a, struct Node* b) {
		return a->data > b->data;
	}
};

// Function to merge k sorted linked lists
struct Node* mergeKSortedLists(
			struct Node* arr[], int k)
{
	// Priority_queue 'pq' implemented
	// as min heap with the help of
	// 'compare' function
	priority_queue<Node*, vector<Node*>, compare> pq;

	// Push the head nodes of all
	// the k lists in 'pq'
	for (int i = 0; i < k; i++)
		if (arr[i] != NULL)
			pq.push(arr[i]);
	
	// Handles the case when k = 0
	// or lists have no elements in them
	if (pq.empty())
		return NULL;

	struct Node *dummy = newNode(0);
	struct Node *last = dummy;

	// Loop till 'pq' is not empty
	while (!pq.empty()) {
		// Get the top element of 'pq'
		struct Node* curr = pq.top();
		pq.pop();

		// Add the top element of 'pq'
		// to the resultant merged list
		last->next = curr;
		last = last->next;
	
		// Check if there is a node
		// next to the 'top' node
		// in the list of which 'top'
		// node is a member
		if (curr->next != NULL)
			
		// Push the next node of top node
		// in 'pq'
		pq.push(curr->next);
	}

	// Address of head node of the required merged list
	return dummy->next;
}

// Function to print the linked list
void printList(struct Node* head) {
	while (head != NULL) {
		cout << head->data << " ";
		head = head->next;
	}
}


int main() {
	// Number of linked lists
	int k = 3;
	// Number of elements in each list
	int n = 4;

	// An array of pointers storing the head nodes of the linked lists
	Node* arr[k];

	arr[0] = newNode(1);
	arr[0]->next = newNode(3);
	arr[0]->next->next = newNode(5);
	arr[0]->next->next->next = newNode(7);

	arr[1] = newNode(2);
	arr[1]->next = newNode(4);
	arr[1]->next->next = newNode(6);
	arr[1]->next->next->next = newNode(8);

	arr[2] = newNode(0);
	arr[2]->next = newNode(9);
	arr[2]->next->next = newNode(10);
	arr[2]->next->next->next = newNode(11);

	struct Node* head = mergeKSortedLists(arr, k);
	printList(head);

	return 0;
}

Comments

Submit
0 Comments

More Questions

boolean in crandom number c ModuleNotFoundError: No module named cv2
check dns server in linuxread files in c how to get user input in c
print boolean value in clatex font sizes see if two strings are equal in C
how to download file in powershellprintf with bool invoke-webrequest download file
write in file in cmongodb delete all documents how to genrate a random number in C
how to print boolean in csleep in c programming install zoom on ubuntu
c concatenate stringstake array as input in c install gitk mac
remove element from np arrayprint an array in c C static libraries (creating object files)
exponentials in cC++ initalize int16_t value script hack blox fruti
pointer operatorcheck command line input is a number in c what is covert channel
sqlserver insert with set identity-usr-bin-env: python-r: No such file or directory linear search program in c
Uri-beecrowd problem no - 1099 solution in Cc addition The fscanf and fprintf functions
function that reverses the content of an array of integers.how to search in a file in c Couldnt create temporary file to work with
WARNING: QA Issue: bgslibrary-dev rdepends on libopencv-imgproc, but it isnt a build dependency, missing opencv in DEPENDS or PACKAGECONFIG [build-deps]reading arrays from stdin c add a item to cart woocomerce with quantity
Using PostgreSQL array to store many-to-many relationship using sqlalchemylistas enlazadas- linked lists binary sorting
c how to include variables of other c filec strcat uri-beecrowd problem no - 1133 solution in C